package com.ssvendas.fachadas;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.ssvendas.fachadas.remote.QueryProdutoRemote;
import com.ssvendas.modelo.Produto;
import com.ssvendas.util.SimilarUtil;

@Stateless
public class QueryProduto implements QueryProdutoRemote{

	@PersistenceContext(unitName = "jeevendas")
	EntityManager em;
	
	private List<String> stringsDeBusca = null;
	private List<Produto> parcial = null;
	private ArrayList<Produto> produtos = null;
	
	@SuppressWarnings("unchecked")
	@Override
	public ArrayList<Produto> buscaProduto(String busca) {
		parcial = new ArrayList<Produto>();
		produtos = new ArrayList<Produto>();
		
		Query query;
		
		if(!busca.equals(""))
			stringsDeBusca = (List<String>) SimilarUtil.obterStrings(busca);
		else{
			stringsDeBusca = new ArrayList<String>();
			stringsDeBusca.add("");
		}
		
		for (String s : stringsDeBusca) {
			s = s.trim();
			query = em.createQuery("SELECT b FROM Produto b WHERE LOWER(b.nomeDescricao) LIKE LOWER(:padrao)");
			query.setParameter("padrao", "%" + s + "%");
			parcial = (List<Produto>) query.getResultList();

			for (Produto b : parcial) {
				if (!produtos.contains(b)) {
					produtos.add(b);
				}
			}
			parcial.clear();
		}

		for (String s : stringsDeBusca) {
			s = s.trim();
			query = em.createQuery("SELECT b FROM Produto b WHERE LOWER(b.aplicacao) LIKE LOWER(:padrao)");
			query.setParameter("padrao", "%" + s + "%");
			parcial = (List<Produto>) query.getResultList();
			for (Produto b : parcial) {
				if (!produtos.contains(b))
					produtos.add(b);
			}
			parcial.clear();
		}

		produtos.trimToSize();
		return produtos;
	}
	
	@Override
	public Produto getProduto(String codigo) {
		Query q = em.createQuery("SELECT p FROM Produto p WHERE p.codigo=:codigo");
		q.setParameter("codigo", codigo);
		Produto p = null;
		if (q.getResultList().size() > 0)
			p = (Produto) q.getSingleResult();
		
		return p;
	}

	@Override
	public Produto geraProdutoSimilar(Produto p) {
		String novoCodigo = SimilarUtil.geraProximoIDSimilar(p);
		p.setCodigo(novoCodigo);
		return p;
	};
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Produto> listaProdutos() {
		Query q = em.createQuery("SELECT p FROM Produto p");
		return q.getResultList();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Produto> listaProdutosSimilares(Produto p) {
		String chave = SimilarUtil.tiraSufixo(p);
		Query q = em.createQuery("SELECT p FROM Produto p WHERE p.codigo LIKE (:codigo)");
		q.setParameter("codigo","%"+ chave +"%");
		return q.getResultList();
	}

	@Override
	public List<Produto> listaProdutosEstoqueMinimo() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Produto> listaProdutosSemEstoque() {
		// TODO Auto-generated method stub
		return null;
	}

}
